package com.probiz.estore.sales.service;

import java.util.List;
import java.util.Map;

import net.sf.json.JSONObject;

import com.probiz.estore.common.model.order.SalesOrder;
import com.probiz.estore.common.model.sales.Gift;
import com.probiz.estore.core.search.SearchCriteria;
import com.probiz.estore.core.service.GenericManager;
import com.probiz.estore.exception.OutOfStockException;
import com.probiz.estore.sales.model.GiftFullyModel;
import com.probiz.estore.sales.model.GiftSearchCriteria;
/**
 * Manager interface for Gift, responsible for business processing, and communicate between web and persistence layer.
 *
 */
public interface GiftManager extends GenericManager<Gift> {
	/**
	 * 搜索礼品，从GenericController借鉴过来。防止翻页过钱
	 *
	 * @param giftSearchCriteria 自定义搜索条件
	 * @param searchCriteria        分页搜索条件
	 * @return 搜索结果
	 */
	public List<Gift> searchByCriteriaForController(
			GiftSearchCriteria giftSearchCriteria, SearchCriteria searchCriteria);

	/**
	 * 根据礼品编码查找礼品
	 *
	 * @param giftCode 礼品编码
	 * @return 礼品
	 */
	public Gift getGiftByGiftCode(String giftCode);

	/**
	 * 完全保存方法
	 * @param model 礼品保存model
	 * @return 返回信息
	 */
	public Map<String, Object> saveFully(GiftFullyModel model) throws Exception;

	/**
	 * 根据礼品编码找出礼品个数，但该礼品的不能是参数id所指定的礼品
	 *
	 * @param giftCode 礼品编码
	 * @param giftId 礼品id
	 * @return 个数
	 */
	public Long getSizeByGiftCodeByNotGiftId(String giftCode, Integer giftId);

	/**
	 * 完全删除方法
	 * @param gift 礼品
	 * @return DELETE_STATUS_PHYSICAL,DELETE_STATUS_LOGICAL,DELETE_STATUS_FALSE其中一个
	 */
	public short deleteFully(Gift gift);

	/**
	 * 根据前台uri获得礼品id
	 *
	 * @param uri 前台uri
	 * @return 礼品id
	 */
	public Integer getGiftIdByUri(String uri);

	/**
	 * 根据礼品获得前台uri
	 *
	 * @param gift 礼品
	 * @return uri
	 */
	public String getUriByGift(Gift gift);

	/**
	 * 为前台构造一个礼品json对象
	 * @param gift
	 * @return 礼品json对象
	 */
	public JSONObject getGiftJSONDataForFront(Gift gift);

	/**
	 * 根据giftCode获得Gift实体,与hibernate session彻底脱离
	 * @param giftCode编号
	 * @return 规格实体
	 */
	public Gift getGiftPojoByGiftCode(String giftCode);

	/**
	 * 为礼品请求分配库存
	 * @param gift 请求分配库存的礼品
	 * @param quantity	请求分配的库存数量  应为正数
	 * @return 返回两个数值，第一个是本次已分配的实际库存数量(正数)，第二个是本次已分配的预订数量（已取消，暂无用，返回0）
	 * @throws OutOfStockException 没有足够的实际库存和可分配给该Sku预订数量时抛出
	 */
	public Integer[] doAllocateStock(Gift gift, Integer quantity)
			throws OutOfStockException;

	/**
	 * 取消单品库存分配
	 * @param salesOrder 应用订单
	 * @param giftSku 取消数量的Sku
	 * @param quantity	取消数量 应为正数
	 */
	public void doCancelAllocateStock(Gift gift, Integer quantity);

	/**
	 * 对单品发货，释放其库存（真正发货时调用）
	 * @param gift
	 * @param quantity 发货数量
	 */
	public void doReleaseStock(Gift gift, Integer quantity);

	/**
	 * 获取礼品会员兑换等级名称字符串，多个以逗号分隔
	 * @param gift
	 * @return
	 */
	public String getMembershipIdsToMembershipName(Gift gift);

	/**
	 * 搜索礼品
	 *
	 * @param giftSearchCriteria 自定义搜索条件
	 * @param searchCriteria        分页搜索条件
	 * @return 搜索结果
	 */
	public List<Gift> searchByCriteria(GiftSearchCriteria giftSearchCriteria,
			SearchCriteria searchCriteria);
	
	/**
	 * 订单编辑后重新为礼品请求分配库存
	 * @param salesOrder 应用订单
	 * @param gift 请求分配库存的gift
	 * @param quantity 请求分配的库存数量
	 * @return 返回两个数值，第一个是本次已分配的实际库存数量(正数)，第二个是本次已分配的预订数量（已取消，暂无用，返回0）
	 * @throws OutOfStockException
	 */
	public Integer[] doAllocateGift(SalesOrder salesOrder,Gift gift, Integer quantity) throws OutOfStockException;
	
	
	/**
	 * 取消礼品库存分配
	 * @param salesOrder 应用订单
	 * @param gift 取消的礼品
	 * @param quantity 取消数量
	 */
	public void doCanCelAllocateGift(SalesOrder salesOrder,Gift gift,Integer quantity);
	
	/**
	 * 礼品发货，释放其库存（真正发发时调用）
	 * @param salesOrder 订单
	 * @param gift 礼品
	 * @param quantity 数量
	 * @throws OutOfStockException
	 */
	public void doReleaseGift(SalesOrder salesOrder,Gift gift, Integer quantity);
	
	/**
	 * 为礼品请求分配库存
	 * @param salesOrder 应用订单
	 * @param gift 请求分配库存的gift
	 * @param quantity 请求分配的库存数量
	 * @return 返回两个数值，第一个是本次已分配的实际库存数量(正数)，第二个是本次已分配的预订数量（已取消，暂无用，返回0）
	 */
	public Integer[] doAllocateGift4OrderAction(SalesOrder salesOrder,Gift gift, Integer quantity);
	
	/**
	 * 根据礼品Id获取礼品
	 * @param giftId
	 * @return
	 */
	public Gift getGiftById(Integer giftId);
}
